package lol.clann.exampleplugin.config;

import lol.clann.bukkit.pluginboot.task.Timer;
import lol.clann.clannboot.annotation.inject.PostInject;
import lol.clann.clannboot.annotation.inject.PreInject;
import lol.clann.clannboot.annotation.load.*;
import lol.clann.clannboot.annotation.svc.Service;
import org.bukkit.Server;
import org.bukkit.entity.Player;
import org.nutz.ioc.loader.annotation.Inject;
import org.slf4j.Logger;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.List;

/**
 * @author pyz
 * @date 2018/10/8 下午11:04
 */
// 以lol.clann.exampleplugin.task.ExampleTask为基础改的,演示配置注入的用法
// 不相关的@Inject就不写了
// 原始写法也不展示了
@Service
public class ConfigTask {

    // 注入管理配置的service
    @Inject
    private ExampleConfig exampleConfig;
    @Inject
    private Server server;
    @Inject
    private Logger logger;

    // 下面是一些service生命周期回调,调用方法从上至下
    // 所有service实例化完成后调用
    @PostConstruct
    private void PostConstruct() {
    }

    // 所有service依赖注入前调用
    @PreInject
    private void PreInject() {
    }

    // 所有service依赖注入完成后调用
    @PostInject
    private void PostInject() {
    }

    // PostInject之后调用
    @PreLoad
    private void PreLoad() {
    }

    // 用来处理读取的插件中的配置文件数据
    // PreLoad 之后调用
    // 插件重载时也会调用,调用时@Configure已经重新注入完毕
    @Reload
    private void Reload() {
    }

    // PostLoad 之前 PreLoad 之后调用
    @Load
    private void Load() {
    }

    // Load 之后调用
    @PostLoad
    private void PostLoad() {
    }

    // 插件卸载时调用
    @Unload
    private void unload() {

    }

    // 没错,这里使用${}直接引用配置
    // async:false 只能在主线程踢人
    @Timer(name = "踢人", dely = "${exampleplugin.dely}", interval = "${exampleplugin.interval}", async = false)
    private void newKick1() {
        List<Player> players = new ArrayList<>(server.getOnlinePlayers());
        for (Player player : players) {
            // 使用配置的踢出消息
            player.kickPlayer(exampleConfig.kickMessage);
        }
    }

}
